package com.koala.swb.sshTunel;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.UserInfo;

/**
 * 
 * @author cerokool32
 * @category Comunicación
 */
public class SSHAgent {
	
	//para iniciar tuneles ssh.
	private String 	user;
	private String 	pass;
	private String 	host;
	private int 	port;
	
	//sesión para manejo de ssh.
	private Session session;
	
	//para envio de archivos por tuneles ssh.
	private Channel canal;
	private ChannelSftp canalSftp;
	
	/**
	 * Constructor del agente administrador de túneles SSH. Recuerde cerrar la conexión al finalizar la sesión SSH. 
	 * @param usuario Nombre de usuario para login en host remoto.
	 * @param password Password del usuario del host remoto.
	 * @param servidor Nombre o IP del host remoto.
	 * @param puerto Puerto a través del cual se conectará al host remoto (default 22).
	 */
	public SSHAgent(String usuario, String password, String servidor, int puerto) {
		
		this.user=usuario;
		this.pass=password;
		this.host=servidor;
		this.port=puerto;
		
	}
	
	/**
	 * Inicia la conexión con el host remoto.
	 */
	public void Conectar(){
		
		JSch jsch=new JSch();
		
		try {
			
			session= jsch.getSession(user, host, port);
			
			UserInfo ui = new SUserInfo(pass, null);
			
			session.setUserInfo(ui);
			session.setPassword(pass);
			
			session.connect();
			
			
		} catch (JSchException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Cierra la conexión con el host remoto.
	 */
	public void CerrarConexion(){
		
		if(session.isConnected())
			session.disconnect();
		
	}

	/**
	 * Ensambla un puerto local con un puerto del host remoto.
	 * @param puertoRemoto Número del puerto remoto al cual quiere acceder.
	 * @param hostRemoto Nombre o IP del host remoto al cual quiere acceder.
	 * @param puertoLocal Puerto local que desea utilizar para acceder a los servicio del host remoto.
	 */
	public void RedireccionarPuertos(int puertoRemoto,String hostRemoto, int puertoLocal){
		
		try {
			
			session.setPortForwardingL(puertoLocal, hostRemoto, puertoRemoto);
			
		} catch (JSchException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Abre un canal de transferencia de archivos mediante SFTP y transfiere el archivo hacia el servidor, en la ruta especificada.
	 * @param archivoFuente
	 * @param archivoDestino
	 */
	public void EnviarArchivo(String archivoFuente, String archivoDestino){
		
		try {
			
			canal=session.openChannel("sftp");
			canal.connect();
			
			canalSftp=(ChannelSftp)canal;
			
			canalSftp.put(archivoFuente, archivoDestino);
			
		} catch (JSchException e) {
			//TODO Ingreso_Excepcion
			e.printStackTrace();
		} catch (SftpException e) {
			//TODO Fantasma_excepcion
			e.printStackTrace();
		}
		
	}
	
	@Override
	protected void finalize() throws Throwable {
		
		if(canal.isConnected())
			canal.disconnect();
		
		if(canalSftp.isConnected())
			canalSftp.disconnect();
		
		if(session.isConnected())
			session.disconnect();
		
		super.finalize();
	}
}
